Postoje dva osnovna razloga za vizualizaciju podataka:
Eksploratorna analiza podataka - EDA (engl. exploratory data analysis): proces analize podatkovnog skupa s ciljem upoznavanja s podacima i donošenjem određenih zaključaka.
tidyr, dplyr …base, grid, lattice, ggplot2…base plotting sustav
plotplotx <- 1:50
# proslijedite `x` i `x*x` funkciji `plot`
plot(x, x*x)
plotPrednosti:
Nedostaci:
Paket grid
Paket lattice
ggplot2zasnovan na tzv. “grafičkoj gramatici” (engl. grammar of graphics)
temelji se na jasno definiranom formalnom modelu
krivulja učenja inicijalno nešto strmija
ggplot2 (2)odlična podrška za stvaranje širokog spektra vizualizacija na osnovu koncizne, jasne i sažete sintakse
omogućuje lako proširenje dodatnim funkcionalnostima
reimplementiran i u drugim programskim jezicima (paket ggplot u Python-u, paket gramm u Matlab-u)
ggplot2Grafička gramatika (engl. grammar of graphics) nam daje sljedeće:
Grafove gledamo kao svojevrsne “rečenice” čije razumijevanje ovisi o tome kako pojedine komponente uklopiti u jasnu, razumljivu cjelinu.
Naputak - graf gledati kao sumu “komponenti” od kojih svaka ima svoju ulogu i doprinosi konačnom rezultatu.
ggplot2Za početak, tri osnovne komponente:
graf = podaci + mapiranje + geometrija
Podatkovni skup je ključna komponenta grafa, predstavlja “ono što želimo vizualizirati”.
Podaci su neovisni od ostatka procesa vizualizacije, budući da se isti principi vizualizacije mogu primjeniti nad različitim podatkovnim skupovima).
Primjer: podatkovni skup mtcars:
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
Pojam “estetika” nema veze sa “znanosti o lijepom”, ovdje se radi o odabiru kako ćemo na grafu prikazati (mapirati) pojedini stupac.
Uobičajeni princip:
Na primjer, za podatkovni skup mtcars odlučujemo:
wt -> os x
mpg -> os y
Osi koordinatnog sustava nisu jedine estetike, ovisno o tome kakav graf crtamo estetike mogu biti:
Estetiku možemo interpretirati i kao “ono što se objašnjava legendom”, pri čemu i osi x i y možemo smatrati svojevrsnim legendama.
“Geometrija” je zapravo “opis kako nešto nacrtati na grafu”, tj. sam način vizualne reprezentacije.
To je ono što često zovemo “vrstom” grafa npr. “točkasti graf” (engl. scatterplot), linijski graf, stupčasti graf (engl. bar chart), histogram itd.
Svaka geometrija definira svoje parametre koji se mogu povezati sa estetikama (mapiranjima).
ako je parametar povezan sa estetikom onda će ovisiti o vrijednosti varijable (npr. boja opisuje vrijednost neke kategorije), ako ne onda je fiksiran na razini grafa (npr. želimo “crvene” točke)
ggplot2 grafaOdabrani podatkovni skup mtcars ima 32 obzervacije i 11 varijabli (sve numeričkog tipa). Zamislimo da želimo vizualizirati odnos dvije varijable, npr. potrošnju (mpg, koja predstavlja broj milja koliko auto prijeđe na jedan galon benzina) i težinu (wt, izraženu u tisućama funti).
Možemo odabrati sljedeći način mapiranja:
wt) na x os grafampg) na y os grafaggplot2 grafaggplot() +
layer( data = mtcars, # 1. podaci
mapping = aes(x = wt, y = mpg), # 2. mapiranja / estetike
geom = "point", # 3. geometrija
stat = "identity", # za sada zanemariti
position = "identity") # za sada zanemariti
ggplot2 grafaObično ne koristimo funkciju layer već kombinaciju funkcija ggplot (u kojoj postavimo “zajedničke” parametre podataka i estetika) te odabrane pomoćne geom_X funkcije.
ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point()
ggplot2 grafaPostoji i funkcija qplot koja zapravo “imitira” sintaksu funkcije plot i služi za lakšu prilagodbu paketu ggplot za funkcije naviknute na osnovne načine vizualizacije u R-u. Ovu funkciju nećemo koristiti u nastavku uglavnom zbog njezinih ograničenih mogućnosti.
qplot(x = wt, y = mpg, data = mtcars)
shape estetikaDodajmo još jednu varijablu u prikazani graf uz pomoć nove estetike - oblika točaka.
# faktorizirajte varijablu `cyl`
mtcars$cyl <- as.factor(mtcars$cyl)
# stvorite graf ovisnosti `mpg` o `wt`
# uz mapiranje `cyl` varijable na `shape` estetiku
ggplot(mtcars, aes(x = wt, y = mpg, shape=cyl)) + geom_point()
color estetikaPogledajmo sada estetiku bojr - tj. color estetiku.
# stvorite graf ovisnosti `mpg` o `wt`
# ovaj put mapirajte `cyl` varijable na `color` estetiku
ggplot(mtcars, aes(x = wt, y = mpg, color=cyl)) + geom_point()
Istu varijablu slobodno možemo mapirati na više estetika.
# ponovite isti graf, ali varijablu `cyl` mapirajte
# i na `color` i na `shape` estetiku
ggplot(mtcars, aes(x = wt, y = mpg, shape=cyl, color=cyl)) + geom_point()
Ukoliko želimo, uz pomoć funkcije labs lako primenujemo osi ili legende te dodajemo naslov našem grafu. Sintaksa izgleda ovako:
ggplot(... ) + ...
... + labs(x = "x os", y = "y os", ...
title = "Naslov")
labs# na sljedećem grafu preimenujte osi i legendu
# te dodajte adekvatni naslov (najbolje nešto što objašnjava graf)
ggplot(mtcars, aes(x = wt, y = mpg, color = cyl, shape = cyl)) + geom_point() + labs(x = "Car weight", y = "Miles per galon", color = "Number of cilinders", shape = "Number of cilinders", title = "Car weight to miles per galon ratio")
Estetike tj. mapiranja direktno utječu na parametre geometrije, tj. oni vise o vrijednostima varijabli koje mapiramo na njih. Ukoliko želimo “fiksirati” parametre geometrije, dovoljno ih je navesti kao parametre geometrijskog sloja sa pripadajućim vrijednostima (ali NE unutar funkcije aes!).
Primjer sintakse:
ggplot(...) + ....
+ geom_point(color = "blue")
Primjer KRIVE sintakse (mapira riječ “blue” na estetiku ‘color’!):
ggplot(...) + ....
+ geom_point(aes(color = "blue"))
# nacrajte graf ovisnosti maksimalne brzine o težini automobila
# koristite geometriju točke
# obojite točke plavom bojom
ggplot(mtcars, aes(x = wt, y = qsec)) + geom_point(color="blue")
# budući da stalno koristimo istu "osnovicu" grafa možemo ju
# pohraniti u zasebnu varijablu npr. imena `graf`
graf <- ggplot(mtcars, aes(x = wt, y = mpg))
# dodajte varijabli `graf` geometriju točaka a potom linijsku geometriju
graf + geom_point() + geom_line()
Statistika je aspekt grafa koji automatski provodi dodatne izračune nad podacima prije same vizualizacije. Izračuni su najčešće agregacije (iako ne uvijek!). Neke češće korištene statistike su:
count - prebrojavanje pojava (za kategorijske varijable)bin - raspoređivanje pojava u ladice i prebrojavanje (za kontinuirane varijable)smooth - “zaglađivanje” tj. “usrednjenje” korištenjem odabrane metode
lm za linearno ili loess za zakrivljeno zaglađivanjeunique - uklanjanje duplikataidentity - direktno preslikavanje, tj. “ostavljanje kako jest”Paket ggplot2 nudi pomoćne funkcije za izračun statistika koje izgledaju ovako: stat_<ime_statistike>
stat_smooth i metoda lm# dodajte geometriju točaka na varijablu `graf`
# te potom dodatni sloj sa krivuljom zaglađivanja
# koristite funkciju `stat_smooth` uz parametar `method`
# postavljen na `lm` (linearno zaglađivanje)
graf + geom_point() + stat_smooth(method=lm)
stat_smooth i metoda loess# ponovite postupak ali metodu zaglađivanja
# postavite na `loess`
graf + geom_point() + stat_smooth(method=loess)
group estetika# stvorite još jednom isti graf ali sloju zaglađivanja
# dodajte estetiku `group` postavljenu na `cyl`
# Što smo ovime postigli?
ggplot(mtcars, aes(x = wt, y = mpg, group=cyl)) + geom_point() + stat_smooth(method=loess)
group estetikakao što smo vidjeli, group estetikom možemo natjerati graf da izračunava statistike zasebno za podgrupe obzervacija, slično kao što radi group_by u paketu dplyr (ili u SQL-u!)
ponekad će ggplot automatski grupirati obzervacije (npr. ako smo već postavili neku kategorijsku varijablu na estetiku boje); ukoliko želimo da se statistike naknadno računaju za cijeli skup, možemo postaviti group estetiku na broj 1 što zapravo znači “za ovaj sloj sve obzervacije su jedna grupa”
geom funkciju i opcionalno podesiti njezin stat parametar ili stat funkciju uz opcionalno podešavanje geom parametra
geom_bar i stat_count# nacrtajte stupčani graf varijable `cyl` tablice `mtcars`
# isprobajte funkcije `geom_bar` i `stat_count`
# ima li razlike?
ggplot(mtcars, aes(x = cyl)) + geom_bar()
# nacrtajte histogram varijable `wt` tablice `mtcars`
# varijablu podijelite jednoliko u četiri ladice
# koristite funkciju `geom_histogram`
ggplot(mtcars, aes(x = wt)) + geom_histogram(bins = 4)
group_by i summarise paketa dplyrstat_bin stvara varijable count, ncount, density i ndensityy, iako po želji to možemo izmjeniti
dovoljno je ručno postaviti estetiku y na odabranu varijablu kojoj smo stavili prefiks i sufiks .. npr.
aes(x = wt, y = ..ndensity..)
ncount# nacrtajte histogram varijable `wt` tablice `mtcars`
# težine podijelite jednoliko u četiri ladice
# koristite funkciju `geom_histogram`
# za agregacijsku varijablu postavite `ncount`
ggplot(mtcars, aes(x = wt, y=..ncount..)) + geom_histogram(bins = 4)
fill estetika u histogramu# nacrtajte histogram varijable `wt`, uz dodanu varijablu `cyl` na estetici `fill`
ggplot(mtcars, aes(x = wt, fill = cyl)) + geom_histogram(bins = 4)
u prethodnom primjeru smo zapravo izračunali zaseban “stupić” za svaku kombinaciju broja cilindara i kategorije težine vozila
kako bismo ovo mogli prikazati na dvodimenzionalnom histogramu, stupiće smo morali “repozicionirati”
ggplot2 je u ovom slučaju automatski postavio aspekt position na stack, tj. slaganje stupića jedan na drugipostavkom pozicijskog aspekta na npr. dodge stupići bi se nacrtali jedan pored drugog
dakle, pozicijski aspekt će repozicionirati određene aspekte geometrije zbog jasnoće prikaza
dodge# nacrtajte opet histogram varijable wt, ali pozicijski aspekt `position` postavite na `"dodge"`
ggplot(mtcars, aes(x = wt, fill = cyl)) + geom_histogram(bins = 4, position="dodge")
identity# nacrtajte isti histogram uz pozicijski aspekt postavljen na `"identity"`
# postavite `alpha` parametar geometrije na 0.4 zbog jasnijeg prikaza
ggplot(mtcars, aes(x = wt, fill = cyl)) + geom_histogram(bins = 4, position="identity", alpha=0.4)
fill# konačno, nacrtajte isti histogram uz pozicijski aspekt `"fill"`
# postavite parametar geometrije `color na "Black" radi ljepšeg prikaza
# objasnite rezultat!
ggplot(mtcars, aes(x = wt, fill = cyl)) + geom_histogram(bins = 4, position="fill", alpha=0.4, color="black")
jittervrlo često se događa da kod prikaza većeg broja obzervacija na grafu one “preklapaju” jedna drugu
pozicijski aspekt jitter dodaje “šum” obzervacijama kako bi se vizualno dao bolji dojam broja obzervacija na određenom području (ovo dobro radi za manje i srednje velike podatkovne skupove)
postoji posebna funkcija geom_jitter koja je zapravo inačica funkcije geom_point sa unaprijed dodanim jitter pozicijskim aspektom, intenzitet kojeg možemo regulirati parametrom width
jitterdf <- data.frame( x = c(rep(1, 90), rep(2, 9), 3),
y = c(rep(1, 70), rep(2, 25), rep(3, 5)))
# prikažite okvir df uz pomoć `scatterplot` grafa, tj. točkaste geometrije
ggplot(df, aes(x=df$x, y=df$y)) + geom_point()
jitter# prikažite isti graf, ali umjesto `geom_point` upotrijebite
# pomoćnu funkciju `geom_jitter` koja ima ugrađen `jitter` pozicijski aspekt
# postavite `width` i `height` parametre na 0.3 (30% dodanog šuma)
# dodatno postavite `color` parametar geometrije na "blue"
# i `alpha` parametar ("prozirnost") na 0.4
ggplot(df, aes(x=df$x, y=df$y)) + geom_jitter(width = 0.3, height = 0.3, color="blue", alpha=0.4)
dva najčešća formata - pdf (vektorski) i png (rasterski)
ggplot2 nudi vrlo zgodnu funkciju ggsave koja sprema zadnje nacrtani graf u datoteku
# spremite sljedeći graf u datoteke `figure1.pdf`i `figure1.png`
graph <- ggplot(mtcars, aes(x = hp, y = mpg, col = as.factor(cyl))) + geom_point() +
geom_smooth(aes(x = hp, y = mpg), method = 'loess', linetype = 4, color = "grey", se = F, inherit.aes = F) +
labs(x = "broj konjskih snaga", y = "potrošnja", col = "broj cilindara")
ggsave(graph, filename = "figure1.pdf")
## Saving 7 x 5 in image
ggsave(graph, filename = "figure1.png")
## Saving 7 x 5 in image
Skale su aspekt koji kontrolira način kako se to mapiranje provodi, tj. metodu preslikavanja samih podataka na vizualne elemente estetike na koju se oni preslikavaju. U slučaju koordinatnih osi tu se radi o preslikavanju numeričkih ili kategorijskih vrijednosti na konkretne udaljenosti na samim osima, dok npr. kod estetike boje skala odlučuje koja boja označava koju vrijednost originalnih podataka.
Ovaj aspekt je do sada uvijek bio implicitno prisutan, ali smo dopuštali ggplot2 paketu da “odabere” default-ne vrijednosti za nas.
scale_Kada radimo sa skalama, najčešće se koristimo ovim pomoćnim funkcijama (* predstavlja “ime estetike”, kao npr. x, y, color itd.):
scale_*_continuous - za mapiranje kontinuiranih (numeričkih) vrijednostiscale_*_discrete - za mapiranje diskretnih vrijednostiscale_ funkcijaSvaka od ovih funkcija ima niz parametara koje možemo koristiti kako bi utjecali na postupak mapiranja. Npr. ako pogledamo dokumentaciju za scale_x_continuous možemo vidjeti da između ostalog možemo postaviti parametre:
name - ime skale koje ujedno postaje i naziv osi/legendebreaks - na kojim pozicijama se stavljaju crticelabels - koje vrijednosti se ispisuju ispod crticalimits - raspon vrijednosti koji će se nalaziti na osiUočite da postoje dodatne pomoćne funkcije koje omogućuju kontrolu gore navedenih parametara i izvan scale_ funkcije, npr. labs za imenovanje osi i legendi, xlim za ograničenje raspona na osi x i sl.
diamondsset.seed(1001)
# stvorite okvir `diamondsSample` u koji ćete staviti
# 5000 nasumičnih redaka iz okvira `diamonds`
diamondsSample = sample_n(diamonds, size = 5000)
# "popravite" osi i legendu grafa koji prikazuje ovisnost veličine dijamanta, boje i cijene
# - osi x i y nazovite "volumen u mm3" i "cijena u $"
# - legendu nazovite "kvaliteta boje"
# - os x ograničite od 0 do 500
# - na osi y postavite crtice na 1000, 5000, 10000 i 20000
# - kategorije kvalitete boje postavite na brojeve od 1 do 7 gdje 1 predstavlja "najbolju" boju
ggplot(diamondsSample, aes(x*y*z, price, color = color)) +
geom_point(alpha = 0.5) + scale_x_continuous(name="volumen u mm3", limits = c(0,500)) + scale_y_continuous(name="cijena u $", breaks = c(1000, 5000, 10000, 15000)) + scale_color_discrete(name="kvaliteta boje", labels = 1:7)
## Warning: Removed 6 rows containing missing values (geom_point).
Vrlo često se događa da na grafovima uočavamo tzv. “eksponencijalni trend”, tj. da nas ovisnost jedna varijable u drugoj podsjeća na eksponencijalnu funkciju.
Ako želimo eksponencijalni trend pretvoriti u linearni, možemo pokušati logaritmirati podatke (što će onda utjecati na prikazane vrijednosti). Umjesto da diram podake, ggplot2 nam nudi opciju da umjesto stadnardne koristimo logaritmiranu (ili neku drugu) skalu. Konkretno, umjesto funkcije scale_*_continuous možemo odabrati:
scale_*_log10 - logaritmira skalu po bazi 10scale_*_reverse - “obrće” skalu s desna na lijevoscale_*_sqrt - “korijenuje” vrijednosti skale# logaritmirajte cijenu dijamanta u prethodno izvedenom grafu
ggplot(diamondsSample, aes(x*y*z, price, color = color)) + geom_point(na.rm = T, alpha = 0.6) +
scale_x_continuous(name = "volumen u mm3" , limits = c(0, 450)) +
scale_y_log10(name = "cijena u $", breaks = c(1000, 5000, 10000, 15000)) +
scale_color_discrete(name = "kvaliteta boje", labels = 1:7)
Estetike color i fill se vrlo često dodatno podešavaju uz pomoć skala. Za ovo imamo zgodne funkcije (dajemo primjere za fill estetike iako većina funkcija postoji i za color):
scale_fill_brewer - odabir jedne od unaprijed pripremljenih paleta boja namijenjenih prikazu diskretnih vrijednosti; imena paleta mogu se pogledati u dokumentacijiscale_fill_distiller - prilagođava palete za diskretne vrijednosti kontinuiranim varijablamascale_fill_gradient - odabir početne i konačne boje koje će se “prelijevati” jedna u drugu; koristimo za prikaz kontinuiranih vrijednostiscale_fill_gradient2, scale_fill_gradientn - ako želimo više “prelijevanja”scale_fill_grey - za crno bijele vizualizacije# podesite `fill` estetiku sljedećeg grafa korištenjem funkcije `scale_fill_brewer`
# parametar `palette` postavite na jednu od sljedećih paleta:
# Blues, BuPu, Greens, Greys, Oranges, OrRd, PuBu, PuRd, Purples, YlGn, YlOrRd
# (još paleta možete naći u dokumentaciji)
ggplot(diamondsSample, aes(x = x*y*z, fill = color)) + geom_histogram(bins = 30, na.rm = T) +
xlim(0, 500) + scale_fill_brewer(palette = "Greens")
Aspekt koordinatnog sustava vrlo rijetko mijenjamo. Razlog tome je što u najvećem broju slučajeva želimo koristiti Kartezijev koordinatni sustav koji ggplot koristi po default-u. Ukoliko smatramo da naša vizualizacija zahtijeva nešto drugo - bilo da se radi o polarnom koordinatnom sustavu, ili želimo “izvrnuti” naš Kartezijev sustav na stranu, ili - što je posebno važno kod analize zemljopisnih podataka - želimo da naša vizualizacija prikazuje zemljopisnu kartu, možemo između ostalog koristiti sljedeće funkcije:
coord_polar - polarni koordinatni sustavcoord_flip - mijenja x i y osicoord_map - koristi karte iz paketa maps i mapproj# pogledajte kako sljedeći graf izgleda u "izvrnutom" a kako u polarnom koordinatnom sustavu
ggplot(diamondsSample, aes(x = x*y*z, fill = color)) + geom_histogram(bins = 30, na.rm = T) +
xlim(40, 100) + coord_flip()
ggplot(diamondsSample, aes(x = x*y*z, fill = color)) + geom_histogram(bins = 30, na.rm = T) +
xlim(40, 100) + coord_polar()
Konačno aspekt teme grafa nam omogućuje da utječemo na sve vizualne aspekte grafa koji nisu povezani s podacima. To znači da možemo birati boju i izgled pozadine, font i veličinu slova, margine, poravnavanja i još niz drugih parametara grafa. Tema nam daje iznimno detaljnu kontrolu nad izgledom grafa, a budući da se zapravo radi o objektu (klase theme), temu grafa možemo pohraniti i reciklirati za sve buduće vizualizacije. Isto tako, ggplot2 nudi niz već unaprijed pripremljenih tema za korištenje i daljnju prilagodbu, a koje dohvaćamo uz skup pomoćnih funkcija od kojih su neke:
theme_gray - default-na tematheme_bw - crno-bijele osi, pogodna za projiciranje grafovatheme_classic - “klasična” tema slična onoj koju producira plot funkcijatheme_void - “prazna” tema# promijenite temu sljedećem grafu na `theme_classic`
ggplot(diamondsSample, aes(x = x*y*z, fill = color)) + geom_histogram(bins = 30, na.rm = T) +
xlim(0, 500)
Često želimo promijeniti samo neki od aspekata grafa koji nije vezan uz podatke (npr. veličina ili orijentacija slova, izgled crtica na osima i sl.). Za ove stvari koristimo funkciju theme koja sadrži vrlo bogati niz parametara (pogledati dokumentaciju!). Neke od tih parametara su tzv. “elementi” teme (npr. element_line, element_text) koje namještamo pozivom pripadne funkcije unutar poziva funkcije theme, npr:
# mijenjamo izgled naziva grafa
# (za obitelj fontova preporučeno koristiti `serif`, `sans` ili `mono`)
... + theme( title = element_text(family = 'serif', face = 'bold.italic'))
# promijenite orijentaciju slova na x osi tako da budu pod kutem od 45 stupnjeva
ggplot(diamondsSample, aes(cut)) + geom_bar() + theme(axis.title.x = element_text(angle = 45))
Već smo se upoznali sa estetikom grupiranja, koja prije vizualizacije unutar skupa podataka radi podskupove po odabranoj varijabli te ih shdono tome na adekvatan način vizualizira. Također smo naučili da možemo raditi implicitna grupiranja uz pomoć estetika boje, oblika, veličine i sl.
Uvjetni (facetirani) grafovi rade na istom principu, ali razdvajanje po odabranoj varijabli (ili varijablama) radi se na način da se vizualizira više grafova koji se onda prikazuju jedan pored drugoga. Rezultatni grafovi prikazuju istu informaciju kao i estetika (implicitne ili eksplicitne) grupe, ali je ovako nešto lakše proučiti svaki podgraf zasebno.
Prije demonstracije kako radimo uvjetno grafove moramo objasniti pojam tzv. “notacije statističkih formula” (statistical formula notation). Ova notacija se često koristi u R-u, pogotovo kod treniranja raznih statističkih modela, a radi se zapravo o formalnoj notaciji međuovisnosti varijabli nekog podatkovnog skupa zamišljenoj na način da se može na što kraći i jednostavniji način zapisati i ugraditi u programski kod.
Formule ćemo detaljnije obrađivati kasnije, a za sada ćemo pokazati samo vrlo jednostavan primjer. Ako želimo zapisati “y u ovisnosti o x-u”, onda formula izgleda ovako:
y ~ x # znači "y u ovisnosti o x-u"
ovo možemo čitati i kao “y kao funkcija od x” ili - u slučaju linearnih modela - “y = ax + b”. Dakle, znak tilda (~) zapravo znači “u ovisnosti o”.
Prikažimo još neke jednostavnije oblike formula:
z ~ x + y # z u ovisnost o x i y (plus ovdje nije aritmetičko zbrajanje!)
y ~ . # y u ovisnosti o "svim ostalim varijablama"
. ~ y # "sve ostale varijable" u ovisnosti o y
~ y # tzv. "jednostrana" formula, "u ovisnosti o y"
Zadnja dva primjera je malo teže matematički definirati no znaju se koristiti u pozivima funkcija za različite svrhe, većinom zbog jednostavnog zapisa i lake interpretacije.
Postoji dva osnovna načina stvaranja uvjetnih grafova, a to je uz pomoć funkcija
facet_grid - za organizaciju “podgrafova” u mrežu tj. matricufacet_wrap - za organizaciju “podgrafova” u jedan ili više redakaFunkciju facet_grid koristimo kad podskupove radimo po jednoj ili dvije kategorijske varijable. Rastavljanje po dvije varijable prirodno radi “matricu”, dok rastavljanje po jednoj će napraviti redak ili stupac, što možemo kontrolirati formulom. Funkciju facet_wrap koristimo kada želimo rastaviti po jednoj varijabli, ali ne želimo da svi budu u jednom stupcu ili retku već ih želimo presložiti u više redaka (zato je i wrap, slično kao word wrap u uređivaču teksta koji prenosti tekst u drugi red).
facet_grid# reduciramo uzorak kako bi radili sa faktorima sa manjim brojem razina
diamondsSample %>% filter(color %in% c("G", "H", "I", "J"),
cut %in% c("Very Good", "Premium", "Ideal")) -> diamondsSample2
# napravite uvjetni graf u ovisnosti o kombinaciji boje (`color`) i reza (`cut`)
# koristite funkciju `facet_grid` i formulu kao parametar
ggplot(diamondsSample2, aes(depth, fill = clarity)) + geom_histogram(bins = 5, position = 'dodge') + facet_grid(facets = color ~ cut)
facet_grid (2)# ponovite postupak, ali sada rastavite samo po boji
# grafove organizirajte u stupac
# koristite funkciju `facet_grid` i notaciju formule sa točkom
ggplot(diamondsSample2, aes(depth, fill = clarity)) + geom_histogram(bins = 5, position = 'dodge') + facet_grid(facets = color ~ .)
facet_wrap# razdvojite sljedeći graf u ovisnosti o prozirnosti (`clarity`)
# koristite funkciju `facet_wrap` i jednostranu formulu
ggplot(diamondsSample, aes(x*y*z, price)) + geom_point() + facet_wrap(~ clarity)
Ovime završavamo priču o gramatičkoj geometriji, njezinim aspektima i primjeni uz pomoć paketa ggplot2. Ovdje nisu ni približno objašnjenje sve mogućnosti ovoga paketa, zbog čega se snažno preporučuje dodanto čitanje dokumentacije i referenciranje na podsjetnik koji sadrži niz geometrija i opcija za koje u ovim lekcijama nije bilo mjesta. Također, ne treba zaboraviti na niz dodatnih paketa koji dodatno proširuju mogućnosti paketa ggplot2, a koje bi trebalo potražiti u ovisnosti o našim zahtjevima i željama glede vizualizacija koje želimo stvoriti za naše projekte podatkovne analize. Za inspiraciju zgodno je pogledati galeriju grafova i slika nastalih uz pomoć jezika R, a koja je dostupna na ovoj poveznici .
Kod eksploratorne analize podataka često je glavni cilj - kvantiteta. Već je rečeno da se eksploratorna analiza svodi na traženje odgovora za niz pitanja koje analitičar postavlja vezano uz podatke. Estetika ovdje često nije bitna - glavno je da grafovi imaju dovoljno informacija da se kod naknadnog pregledavanja može ono što je predočeno staviti u odgovarajući kontekst. Analitičar će također često isprobavati različite kombinacije estetika, geometrija i statistika.
#library(GGally) # ako nije učitan!
ggpairs(data = mtcars[,1:6])
Kod izvještavanja s druge strane ključna je kvaliteta grafa u smislu jasnog i preglednog predstavljanja informacije. Graf mora jasno komunicirati informacije koje su njime predočene, uz pažljivo odabrana objašnjenja i pomno odabrano korištenje tzv. metapodataka, tj. dodatnog teksta i anotacija. Za stvaranje izvještajnih grafova preporučuje se koristiti dodatne geom_text slojeve za tekstualnim oznakama na odgovarajućim područjima grafa gdje one mogu najviše doprinijeti, a također i kreativno korištenje geom_point, geom_hline, geom_vline, geom_rect i sličnih geometrijskih slojeva koji će dodatno pojasniti određene segmente grafa. Isto tako, preporučuje se unaprijed pripremiti temu koju ćemo onda konzistentno primjenjivati na sve grafove.
U velikom slučajeva grafovi u izvještajima su zapravo probrani i “uljepšani” grafovi dobiveni tijekom eksploratorne analize. No analitičar bi trebao posebnu pažnju posvetiti činjenici da se grafovi u izvještajima često rade za publiku koja je daleko manje upoznata sa podatkovnim skupom i raznim detaljnim saznanjima koje je analitičar dobio tijekom eksploratorne analize. Izvještajni grafovi stoga moraju biti orijentirani krajnjem korisniku, te s tim ciljem i pažljivo dizajnirani. Zbog toga se preporučuje da svi elementi grafa - uključujući i naslov, legende i sl. budu orijentirani komunikaciji informacije i razjašnjenju što graf prikazuje, a što je u skladu sa zaključcima koje publikacija iznosi.
Konačno, ponekad želimo zbog štednje prostora unutar jedne slike staviti više različitih grafova. Ovo obično radimo uz pomoć više zasebnih slika koje slažemo unutar sučelja kojeg koristimo za pisanje publikacije čiji su dio navedeni grafovi, no možemo i unaprijed pripremiti grafove uz pomoć paketa gridExtra. Između ostalog, ovaj paket nudi funkciju grid.arrange uz pomoć koje grafove slažemo u matricu s odabranim brojem redaka i stupaca.
#library(gridExtra) # ukoliko je potrebno
# grafove koje slažem u matricu pohranjujem u varijable
g1 <- ggplot(diamondsSample, aes(x*y*z, price, color = color)) + geom_point(alpha = 0.6)
g2 <-ggplot(diamondsSample, aes(x = x*y*z, fill = color)) + geom_histogram(bins = 30, na.rm = T) +
scale_fill_brewer(palette = "Greens")
g3 <- ggplot(diamondsSample, aes(x = cut)) + geom_bar(fill = "blue", alpha = 0.5)
g4 <- ggplot(diamondsSample, aes(x = color, fill = clarity)) + geom_bar() + coord_polar()
grid.arrange(g1, g2, g3, g4, nrow = 2, ncol = 2)